home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / utility / utilmisc / xfd_pwf.lha / xfd_pwf / xfd_pwf.c < prev    next >
C/C++ Source or Header  |  1996-10-28  |  8KB  |  240 lines

  1. // password finder for xfd packed files
  2.  
  3. #define _VERSION "1.0"
  4. #define __L_PASSWORD 100
  5. #define __EVERYWORDS 1000
  6. #define __MAXCHARS 5
  7.  
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <exec/types.h>
  11.  
  12. #include <clib/xfdmaster_protos.h>
  13. #include <pragma/xfdmaster_lib.h>
  14. #include <libraries/xfdmaster.h>
  15.  
  16. #include <pragma/exec_lib.h>
  17. #include <pragma/dos_lib.h>
  18.  
  19. struct Library *xfdMasterBase;
  20.  
  21. int flenght(FILE *file) {
  22.  int l;
  23.  int offset;
  24.  
  25.  offset = ftell(file);
  26.  fseek(file,0,SEEK_END);
  27.  l = ftell(file);
  28.  fseek(file,offset,SEEK_SET);
  29.  return(l);
  30. }
  31.  
  32. void main(int argc, char **argv) {
  33.  FILE *rfile = NULL; //source
  34.  char source[FILENAME_MAX];
  35.  FILE *wfile = NULL; //dest
  36.  char dest[FILENAME_MAX];
  37.  FILE *f_dic = NULL; //dictionary file
  38.  FILE *f_chr = NULL; //character file
  39.  int l,chrs_len;
  40.  int i,j;
  41.  int curr_chrs,curr_chr;
  42.  int success;
  43.  char *buffer;
  44.  void *object;
  45.  struct xfdBufferInfo bufferinfo;
  46.  BOOL b_password = FALSE,b_key16 = FALSE,b_key32 = FALSE;
  47.  BOOL b_dic = FALSE, b_pw = FALSE, b_chr = FALSE;
  48.  char password[__L_PASSWORD];
  49.  char dictionary[FILENAME_MAX],charfile[FILENAME_MAX];
  50.  char characters[256];
  51.  int everywords,maxchars;
  52.  int char_offs[__L_PASSWORD + 1];
  53.  
  54.  const char version[] = "\0$VER: xfd_pwf " _VERSION " (" __DATE2__ ")";
  55.  printf("XFD PassWordFinder (c) 1996 Denis Unger\n\n");
  56.  
  57.  xfdMasterBase = OpenLibrary( XFDM_NAME, XFDM_VERSION);
  58.  if(!xfdMasterBase) {
  59.     printf("Couldn't open " XFDM_NAME " %d\n", XFDM_VERSION);
  60.     exit(0);
  61.   }
  62.  
  63.  struct RDArgs *readargs;
  64.  LONG rargs[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL};
  65.  char uebergabe[] = "SOURCE/A,DEST/A,DIC/K,PW/K,CHR/K,EVERYWORDS/N,MAXCHARS/N";
  66.  
  67.  if((readargs = ReadArgs( uebergabe, rargs, NULL))) {
  68.     strcpy(source, (STRPTR) rargs[0]);
  69.     strcpy(dest, (STRPTR) rargs[1]);
  70.     if(rargs[2]) {strcpy(dictionary, (STRPTR) rargs[2]); b_dic = TRUE;}
  71.     if(rargs[3]) {strcpy(password, (STRPTR) rargs[3]); b_pw = TRUE;}
  72.     if(rargs[4]) {strcpy(charfile, (STRPTR) rargs[4]); b_chr = TRUE;}
  73.     if(rargs[5]) everywords = *(LONG *)rargs[5]; else everywords = __EVERYWORDS;
  74.     if(rargs[6]) maxchars = *(LONG *)rargs[6]; else maxchars = __MAXCHARS;
  75.  
  76.     FreeArgs(readargs);
  77.  } else {
  78. //  printf("%s\n",uebergabe);
  79.     CloseLibrary(xfdMasterBase);
  80.     exit(0);
  81.  }
  82.  
  83.  rfile = fopen(source, "r");
  84.  if(!rfile) {
  85.     printf("Error opening file %s.\n",source);
  86.     exit(0);
  87.   }
  88.  l = flenght(rfile);
  89.  printf("Lenght of crunched file: %d Bytes\n",l);
  90.  
  91.  buffer = new char[l];
  92.  fread(buffer,l,1,rfile);
  93.  fclose(rfile);
  94.  
  95.  object = xfdAllocObject(XFDOBJ_BUFFERINFO);
  96.  
  97.  bufferinfo.xfdbi_SourceBuffer = buffer;
  98.  bufferinfo.xfdbi_SourceBufLen = l;
  99.  bufferinfo.xfdbi_Flags = 0;
  100.  bufferinfo.xfdbi_PackerFlags = 0;
  101.  
  102.  success = xfdRecogBuffer(&bufferinfo);
  103.  if(!success) {
  104.     printf("error (%d): xfdRecogBuffer\n",bufferinfo.xfdbi_Error);
  105.   }
  106.  
  107.  printf("Packer: %s\n",bufferinfo.xfdbi_PackerName);
  108.  
  109.  if(bufferinfo.xfdbi_PackerFlags & 1<<XFDPFB_PASSWORD) {
  110.     printf(" crypted with password ...\n"); b_password = TRUE;
  111.   }
  112.  if(bufferinfo.xfdbi_PackerFlags & 1<<XFDPFB_KEY16) {
  113.     printf(" crypted with key16 ...\n"); b_key16 = TRUE;
  114.   }
  115.  if(bufferinfo.xfdbi_PackerFlags & 1<<XFDPFB_KEY32) {
  116.     printf(" crypted with key32 ...\n"); b_key32 = TRUE;
  117.   }
  118.  
  119.  bufferinfo.xfdbi_TargetBufMemType = 0;
  120.  
  121.  if(b_password && b_chr) {
  122.     f_chr = fopen(charfile, "r");
  123.     if(f_chr) {
  124.         if(fgets(characters, 255, f_chr)) chrs_len = strlen(characters);
  125.         printf("Testing with %d characters.\n",chrs_len);
  126.         fclose(f_chr);
  127.         if(b_pw) { // ab bestimmtem password
  128.             printf("Testing from password <%s> ...\n",password);
  129.             curr_chrs = strlen(password);
  130.             curr_chr = curr_chrs;
  131.             for(j=0;j<=strlen(password);j++) {
  132.                 for(i=0;i<chrs_len;i++) {
  133.                     if(password[j] == characters[i]) {
  134.                         char_offs[j] = i;
  135.                         break;
  136.                     }
  137.                 }
  138.             }
  139.             for(j=(strlen(password)+1);j<__L_PASSWORD;j++) {
  140.                 password[j] = 0;
  141.                 char_offs[j] = 0;
  142.             }
  143.         } else {
  144.             curr_chrs = 1;
  145.             curr_chr = 0;
  146.             for(j=0;j<__L_PASSWORD;j++) {
  147.                 password[j] = 0; //password mit 0 füllen
  148.                 char_offs[j] = 0; //offsets mit 0 füllen
  149.             }
  150.             printf("Testing all words with 1 character.\n");
  151.         }
  152.         i = 0;
  153.         for(;;) {
  154.             if(curr_chrs > maxchars) break; //erst mal aussteigen
  155.             for(j=0;j<curr_chrs;j++)
  156.                 password[j] = characters[char_offs[j]]; //create password
  157.             curr_chr = curr_chrs - 1;
  158.             char_offs[curr_chr]++; //last character + 1
  159.             if(char_offs[curr_chr] == chrs_len) {
  160.                 for(;;) {
  161.                     curr_chr--;
  162.                     if(curr_chr == -1) {
  163.                         curr_chrs++; //password lenght + 1 character
  164.                         printf("Testing all words with %d characters.\n",curr_chrs);
  165.                         for(j=0;j<curr_chrs;j++) char_offs[j] = 0;
  166.                         break;
  167.                     }
  168.                     char_offs[curr_chr]++; char_offs[curr_chr + 1] = 0;
  169.                     if(char_offs[curr_chr]<chrs_len) break;
  170.                 }
  171.             }
  172.             i++;
  173.             if(!(i % everywords)) printf("%d words checked (last password:%s)\n",i,password); //every ... words
  174.             bufferinfo.xfdbi_Special = password;
  175.             success = xfdDecrunchBuffer(&bufferinfo);
  176.             if(success) {
  177.                 printf("Password is <%s>.\n",password);
  178.                 FreeMem(bufferinfo.xfdbi_TargetBuffer,bufferinfo.xfdbi_TargetBufLen);
  179.                 bufferinfo.xfdbi_TargetBuffer = NULL;
  180.                 break;
  181.             }
  182.  
  183.         }
  184.     } else printf("Couldn't open character file %s.\n",charfile);
  185.  } else
  186.  if(b_password && b_dic) {
  187.     f_dic = fopen(dictionary, "r");
  188.     if(f_dic) {
  189.         i = 0;
  190.         for(;;) {
  191.             if(!fgets(password,__L_PASSWORD,f_dic)) {
  192.                 printf("No password found.\n");
  193.                 break;
  194.             }
  195.             i++;
  196.             if(!(i % everywords)) printf("%d words checked (last password:%s)\n",i,password); //every ... words
  197.             bufferinfo.xfdbi_Special = password;
  198.             success = xfdDecrunchBuffer(&bufferinfo);
  199.             if(success) {
  200.                 printf("Password is %s.\n",password);
  201.                 FreeMem(bufferinfo.xfdbi_TargetBuffer,bufferinfo.xfdbi_TargetBufLen);
  202.                 bufferinfo.xfdbi_TargetBuffer = NULL;
  203.                 break;
  204.             }
  205.  
  206.         }
  207.     } else printf("Couldn't open dictionary %s.\n",dictionary);
  208.  } else
  209.  if(b_password) {
  210.     printf("password lenght: %d\n",bufferinfo.xfdbi_MaxSpecialLen);
  211.     bufferinfo.xfdbi_Special = password;
  212.  }
  213.  
  214.  success = xfdDecrunchBuffer(&bufferinfo);
  215.  if(!success) {
  216.     printf("Couldn't decrunch file.\n");
  217.   }
  218.  
  219.  if(buffer) { //Ausgangsbuffer wird nicht mehr benötigt
  220.     delete buffer; buffer = NULL;
  221.  }
  222.  
  223.  printf("Lenght of decrunched file: %d Bytes\n",bufferinfo.xfdbi_TargetBufSaveLen);
  224.  
  225.  wfile = fopen( dest, "w");
  226.  if(wfile) {
  227.     fwrite(bufferinfo.xfdbi_TargetBuffer,bufferinfo.xfdbi_TargetBufSaveLen,1,wfile);
  228.     fclose(wfile);
  229.  } else printf("Couldn't create file %s.\n",dest);
  230.  
  231.  if(bufferinfo.xfdbi_TargetBuffer) {
  232.     FreeMem(bufferinfo.xfdbi_TargetBuffer,bufferinfo.xfdbi_TargetBufLen);
  233.     bufferinfo.xfdbi_TargetBuffer = NULL;
  234.   }
  235.  
  236.  xfdFreeObject(object);
  237.  
  238.  CloseLibrary(xfdMasterBase);
  239. }
  240.